package com.xyh.affairs.mtmasege;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.group.ChannelGroup;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @version v1.0
 * @类描述：处理事务类当出现第一服务创建事务组，然后服务根据事务组id 进行事务添加，当事务组结束的时候出现需要回滚的事务时候就进行事务回滚
 * @项目名称：
 * @包名： com.xyh.affairs.mtmasege
 * @类名称：MtManageServer
 * @创建人：YIHANG.XU
 * @创建时间：2020/8/99:56 上午
 * @修改人：YIHANG.XU
 * @修改时间：2020/8/99:56 上午
 * @修改备注：
 * @Copyright
 */

public class MtManageServer extends ChannelHandlerAdapter {
    //存储事务信息容器
    public static final Map<String, List> affairsMap = new HashMap<>();
    //存储是否结束事务
    public static final Map<String, Boolean> isMap = new HashMap<>();
    public static final Map<String, Integer> transactionCountMap = new HashMap<>();



    //接收服务端传输来的消息
    @Override
    public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        JSONObject jsonObject = JSON.parseObject((String) msg);
        //创建事务组 create 创建事务 add 添加分支事务
        String command = jsonObject.getString("command");
        //事务组
        String groupId = jsonObject.getString("groupId");
        //事务状态 commit rollback
        String transactionType = jsonObject.getString("transactionType");
        //事务数量
        Integer transactionCount = jsonObject.getInteger("transactionCount");
        //是否结束
        Boolean isEnd = jsonObject.getBoolean("isEnd");
        if ("create".equals(command)) {
            affairsMap.put(groupId, new ArrayList<String>());

        } else if ("add".equals(command)) {
            affairsMap.get(groupId).add(transactionType);
            if (isEnd) {
                isMap.put(groupId, true);
                transactionCountMap.put(groupId, transactionCount);
            }
            JSONObject result = new JSONObject();
            result.put("groupId", groupId);
            if (isMap.get(groupId) && transactionCountMap.get(groupId).equals(affairsMap.get(groupId).size())) {
                if(affairsMap.get(groupId).contains("rollback")){
                    result.put("command","rollback");
                    //返回信息
                    sendRest(result);
                }else {
                    result.put("command","commit");
                    //返回信息
                    sendRest(result);
                }
            }
        }
    }

    private void sendRest(JSONObject result) {

    }
}
